//
//  DMLifecycleCallbackManager.h
//  DualMediationSDK
//
//  SDK回调管理器
//  负责处理和分发各种SDK回调事件
//

#import <Foundation/Foundation.h>
#import "../Types/DMLifecycleTypes.h"
#import "../Types/DMLifecycleProtocols.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 回调处理结果
 */
typedef NS_ENUM(NSInteger, DMCallbackHandleResult) {
    DMCallbackHandleResultSuccess = 0,      // 处理成功
    DMCallbackHandleResultPartialFailure,  // 部分处理失败
    DMCallbackHandleResultFailure,         // 处理失败
    DMCallbackHandleResultNoHandlers       // 没有处理器
};

/**
 * 回调统计信息
 */
@interface DMCallbackStatistics : NSObject
@property (nonatomic, assign) NSUInteger totalCallbacks;        // 总回调数量
@property (nonatomic, assign) NSUInteger successfulCallbacks;  // 成功处理数量
@property (nonatomic, assign) NSUInteger failedCallbacks;      // 失败处理数量
@property (nonatomic, assign) NSTimeInterval totalProcessTime; // 总处理时间
@property (nonatomic, assign) NSTimeInterval averageProcessTime; // 平均处理时间
@end

/**
 * SDK回调管理器
 * 负责处理Facebook登录、产品购买、分享等各种SDK回调
 */
@interface DMLifecycleCallbackManager : NSObject

#pragma mark - 单例访问

/**
 * 获取回调管理器单例
 * @return 回调管理器实例
 */
+ (instancetype)sharedManager;

#pragma mark - 配置属性

/**
 * 是否启用异步回调处理（默认YES）
 */
@property (nonatomic, assign) BOOL asyncCallbackEnabled;

/**
 * 回调处理超时时间（秒，默认10秒）
 */
@property (nonatomic, assign) NSTimeInterval callbackTimeout;

/**
 * 是否启用回调统计（默认NO）
 */
@property (nonatomic, assign) BOOL statisticsEnabled;

/**
 * 是否启用调试模式（默认NO）
 */
@property (nonatomic, assign) BOOL debugModeEnabled;

#pragma mark - Facebook登录回调

/**
 * 处理Facebook登录结果
 * @param result 登录结果数据
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleFacebookLoginResult:(DMLoginResponse *)result;

/**
 * 异步处理Facebook登录结果
 * @param result 登录结果数据
 * @param completion 完成回调
 */
- (void)handleFacebookLoginResultAsync:(DMLoginResponse *)result 
                            completion:(nullable void(^)(DMCallbackHandleResult result))completion;

#pragma mark - 产品相关回调

/**
 * 处理获取产品列表结果
 * @param products 产品列表
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleGetProductsResult:(NSArray<DMProductInfo *> *)products;

/**
 * 处理获取已购买产品结果
 * @param purchases 已购买产品列表
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleGetPurchasedProductsResult:(NSArray<DMPurchaseInfo *> *)purchases;

/**
 * 处理购买失败回调
 * @param error 错误信息
 * @param productId 产品ID
 * @return 处理结果
 */
- (DMCallbackHandleResult)handlePurchaseFailure:(NSError *)error productId:(NSString *)productId;

/**
 * 处理购买成功回调
 * @param purchaseInfo 购买信息
 * @return 处理结果
 */
- (DMCallbackHandleResult)handlePurchaseSuccess:(DMPurchaseInfo *)purchaseInfo;

/**
 * 处理评价触发失败回调
 * @param error 错误信息
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleRatingTriggerFailure:(NSError *)error;

#pragma mark - 分享回调

/**
 * 处理分享结果
 * @param success 是否成功
 * @param error 错误信息（如果失败）
 * @param platform 分享平台
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleShareResult:(BOOL)success 
                                      error:(nullable NSError *)error 
                                   platform:(NSString *)platform;

#pragma mark - BMS配置回调

/**
 * 处理BMS配置更新
 * @param config 配置信息
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleBMSConfigUpdate:(NSDictionary *)config;

#pragma mark - 推送消息回调

/**
 * 处理推送消息点击
 * @param messageInfo 消息信息
 * @return 处理结果
 */
- (DMCallbackHandleResult)handlePushMessageClick:(NSDictionary *)messageInfo;

/**
 * 触发推送消息点击回调
 * @param messageId 消息ID
 */
- (void)triggerPushMessageClick:(NSString *)messageId;

/**
 * 触发购买结果回调
 * @param resultCode 结果代码
 * @param data 结果数据
 */
- (void)triggerPurchaseResult:(NSInteger)resultCode data:(nullable id)data;

#pragma mark - 通用回调处理

/**
 * 处理通用SDK回调
 * @param callbackType 回调类型
 * @param data 回调数据
 * @return 处理结果
 */
- (DMCallbackHandleResult)handleGenericCallback:(NSString *)callbackType data:(nullable id)data;

/**
 * 异步处理通用SDK回调
 * @param callbackType 回调类型
 * @param data 回调数据
 * @param completion 完成回调
 */
- (void)handleGenericCallbackAsync:(NSString *)callbackType 
                              data:(nullable id)data 
                        completion:(nullable void(^)(DMCallbackHandleResult result))completion;

#pragma mark - 回调队列管理

/**
 * 暂停回调处理
 */
- (void)pauseCallbackHandling;

/**
 * 恢复回调处理
 */
- (void)resumeCallbackHandling;

/**
 * 检查回调处理是否已暂停
 * @return YES 如果回调处理已暂停
 */
- (BOOL)isCallbackHandlingPaused;

/**
 * 清空待处理的回调队列
 */
- (void)clearPendingCallbacks;

/**
 * 获取待处理回调数量
 * @return 待处理回调数量
 */
- (NSUInteger)getPendingCallbackCount;

#pragma mark - 错误处理

/**
 * 回调处理错误回调
 * @param error 处理过程中的错误
 * @param callbackType 回调类型
 * @param data 回调数据
 */
typedef void(^DMCallbackErrorHandler)(NSError *error, NSString *callbackType, id _Nullable data);

/**
 * 设置回调处理错误处理器
 * @param errorHandler 错误处理回调
 */
- (void)setCallbackErrorHandler:(nullable DMCallbackErrorHandler)errorHandler;

#pragma mark - 统计和监控

/**
 * 获取回调统计信息
 * @return 统计信息，如果未启用统计则返回nil
 */
- (nullable DMCallbackStatistics *)getCallbackStatistics;

/**
 * 重置回调统计信息
 */
- (void)resetCallbackStatistics;

/**
 * 获取性能报告
 * @return 包含性能数据的字典
 */
- (NSDictionary *)getPerformanceReport;

/**
 * 获取回调处理历史
 * @param limit 返回记录的最大数量，0表示返回所有记录
 * @return 回调处理历史数组
 */
- (NSArray *)getCallbackHistory:(NSUInteger)limit;

#pragma mark - 调试支持

/**
 * 获取调试信息
 * @return 包含调试信息的字典
 */
- (NSDictionary *)getDebugInfo;

/**
 * 验证回调管理器状态
 * @return YES 如果状态正常
 */
- (BOOL)validateManagerState;

/**
 * 导出回调处理日志
 * @param limit 日志条数限制，0表示全部
 * @return JSON格式的日志字符串
 */
- (nullable NSString *)exportCallbackLogWithLimit:(NSUInteger)limit;

/**
 * 模拟回调（仅用于测试）
 * @param callbackType 回调类型
 * @param data 模拟数据
 * @return 处理结果
 */
- (DMCallbackHandleResult)simulateCallback:(NSString *)callbackType data:(nullable id)data;

@end

NS_ASSUME_NONNULL_END
